﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Uurrooster_opdracht
{
    public partial class formStudentenOud : Form
    {
        

        //===========================DECLARATIE VARIABELEN===================================
        DataClasses1DataContext DB;
        List<tblStudent> LIJSTSTUDENTEN;
        
        

        //===========================INITIALISATIE===========================================
        public formStudentenOud()
        {
            InitializeComponent();
            DB = new DataClasses1DataContext();
            LIJSTSTUDENTEN = DB.tblStudents.ToList();
        }



        private void formStudenten_Load(object sender, EventArgs e)
        {
            enableAllButtons();
            updateTotal();
            butFirst_Click(null, null);
        }


        //===========================HANDLERS VOOR ALLE BUTTONS============================================

        private void butFirst_Click(object sender, EventArgs e)
        {
            long EERSTE_ID = LIJSTSTUDENTEN.First().studentID;

            this.dipslayStudent(EERSTE_ID);

            //de knoppen mogen terug aan, als ze afstonden!
            enableAllButtons();

        }



        private void butNext_Click(object sender, EventArgs e)
        {
            //algemene voorbereiding
            LIJSTSTUDENTEN = DB.tblStudents.ToList();

            //inlezen van de studentenID die momenteel in het tekstvenster staat
            String huidigeID = txtStudentID.Text;

            //omzetten naar een long
            long huidigeStudentID = Convert.ToInt64(huidigeID);
            
            //startwaarde om positie van huidige student in lijst te zoeken
            int index = -1;

            //index laten oplopen zolang de juiste student niet gevonden is
            //totdat einde lijst bereikt is
            do
            {
                index++; //opmerking : feitelijk starten we bij item nr 0
            }
            while( (LIJSTSTUDENTEN[index].studentID != huidigeStudentID) &&
                   (index < LIJSTSTUDENTEN.Count()                     )     );

            //nu wordt overgeschakeld van de huidige student op de volgende student
            index ++;

            //de loop wordt verlaten indien alle elementen uit de lijst zijn doorlopen
            //in dat geval = index gelijk aan Count()
            //in dat geval -> doe niets
            if (index == LIJSTSTUDENTEN.Count() )
            {
                disableAllButtons();
                butFirst.Enabled = true;
                txtVoornaam.Text = "GEEN NEXT!";
                txtAchternaam.Text = "GEEN NEXT!";
                txtStudentID.Text = "GEEN NEXT!";
                return;
            }
            
            //de loop wordt ook verlaten in dat geval is de index gelijk aan de huidig af te beelden 
            //student
            if (index < LIJSTSTUDENTEN.Count() )
            {
                txtVoornaam.Text = index + "";
                this.dipslayStudent(LIJSTSTUDENTEN[index].studentID);
            }

        }



        //verwijderen van een student
        private void butDelete_Click(object sender, EventArgs e)
        {
            //inlezen van de studentenID die momenteel in het tekstvenster staat
            String huidigeID = txtStudentID.Text;

            //omzetten naar een long
            long huidigeStudentID = Convert.ToInt64(huidigeID);

            //de te deleten student selecteren uit de database
            tblStudent magweg = (from tblStudent
                                 in DB.tblStudents
                                 where tblStudent.studentID == huidigeStudentID
                                 select tblStudent).First();

            //doorvoeren wijzigingen
            DB.tblStudents.DeleteOnSubmit(magweg);
            DB.SubmitChanges();

            try
            {
                this.Validate();
            }
            catch
            {
                MessageBox.Show("Update failed!");
            }


            //updaten van het schermgebeuren
            butFirst_Click(null, null);

        }




        //wist de schermen, en maakt de ADD knop actief !
        private void butClear_Click(object sender, EventArgs e)
        {
            txtVoornaam.Text = "";
            txtAchternaam.Text = "";
            txtStudentID.Text = "***";

            //knop add mag nu actief zijn !
            disableAllButtons();
            butAdd.Enabled = true;

        }




        //button ADD
        private void butAdd_Click(object sender, EventArgs e)
        {
            //de informatie in de tekstvelden moet kunnen omgezet worden naar een string
            //van lengte 20
            tblStudent NIEUW = new tblStudent();
            NIEUW.studentVoornaam = txtVoornaam.Text;
            NIEUW.studentNaam = txtAchternaam.Text;

            //submitten van de creatie van de nieuwe student
            DB.tblStudents.InsertOnSubmit(NIEUW);
            DB.SubmitChanges();

            //updaten van de scherminfo
            this.dipslayStudent(NIEUW.studentID);
        }



        //===========================LEGE METHODEN=========================================================

        private void label3_Click(object sender, EventArgs e)
        {

        }
        
        
        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        
        private void label2_Click(object sender, EventArgs e)
        {

        }

        
        private void txtAchternaam_TextChanged(object sender, EventArgs e)
        {

        }

        

        //===========================ZELF GEMAAKTE HULP FUNCTIES==================================
        
        //zet alle knoppen actief
        private void enableAllButtons()
        {
            butFirst.Enabled = true;
            butNext.Enabled = true;
            butAdd.Enabled = false;  //uitzondering! kan alleen indien men eerst op new drukt
            butDelete.Enabled = true;
            butEdit.Enabled = true;
            butClear.Enabled = true;
        }



        //zet allen knoppen af
        private void disableAllButtons()
        {
            butFirst.Enabled = true;  //uitzondering: mag altijd aanblijven staan...
            butNext.Enabled = false;
            butAdd.Enabled = false;
            butDelete.Enabled = false;
            butEdit.Enabled = false;
            butClear.Enabled = false;
        }




        //zorg dat het totaal van de student wordt geupdate
        private void updateTotal()
        {
            //update van de lijsten
            LIJSTSTUDENTEN = DB.tblStudents.ToList();
            //update van het totaal
            lblTotaal.Text = "" + LIJSTSTUDENTEN.Count();
        }



        private void dipslayStudent(long X)
        {
            //voor alle veiligheid ook het totaal updaten
            updateTotal();

            //opzoeken van student met dit StudentenID
            tblStudent gekozen = (from tblStudent
                                  in DB.tblStudents
                                  where tblStudent.studentID == X
                                  select tblStudent).First();

            //gegevens in de tekstvelden zetten
            txtAchternaam.Text = gekozen.studentNaam;
            txtVoornaam.Text = gekozen.studentVoornaam;
            txtStudentID.Text = gekozen.studentID + "";
        }

        private void butEdit_Click(object sender, EventArgs e)
        {
            //inlezen van de studentenID die momenteel in het tekstveld staat
            String huidigeID = txtStudentID.Text;

            //omzetten naar een long
            long huidigeStudentID = Convert.ToInt64(huidigeID);

            //opzoeken van student met dit StudentenID
            tblStudent gekozen = (from tblStudent
                                  in DB.tblStudents
                                  where tblStudent.studentID == huidigeStudentID
                                  select tblStudent).First();

            //de tekstvelden moet gereduceerd worden tot lengte 20 characters!
            //de info uit de tekstvelden naar een lengte brengen die zeker 20 characters is
            //en dit om mogelijke format-Out_of_Bounds Exceptions te voorkomen in de database!
            
            //de info uit de tekstvelden opslaan
            gekozen.studentNaam = txtAchternaam.Text.PadRight(20);
            gekozen.studentNaam = gekozen.studentNaam.Substring(0, 20);

            gekozen.studentVoornaam = txtVoornaam.Text.PadRight(20);
            gekozen.studentVoornaam = txtVoornaam.Text.Substring(0,20);
            
            //de aangepaste gegevens nu nog opslaan in de database
            DB.SubmitChanges();

            //updaten van scherminfo
            dipslayStudent(gekozen.studentID);
        }






    }
}
